/*
#include <stdio.h>
#include <stdlib.h>
//实现升序排序。
//接受两个参数e1和e2，这两个参数的类型是void指针，因为qsort函数要求比较函数的参数类型必须是void指针。
//如果返回值为负数，则表示e1指向的整数小于e2指向的整数；
//如果返回值为正数，则表示e1指向的整数大于e2指向的整数；
//如果返回值为0，则表示e1指向的整数等于e2指向的整数。
int int_cmp(const void*e1,const void*e2)
{
  return *(int*)e1-*(int*)e2;
}
int main(int argc, char *argv[])
{
  int n,m,i;
  int arr[1001],brr[1001];
  scanf("%d%d",&n,&m);
  for(i=0;i<n;i++)
  {
    scanf("%d",&arr[i]);
  }
  //标准库函数qsort对数组arr进行排序。
  //第一个参数是待排序的数组arr，第二个参数是数组中元素的个数n，第三个参数是每个元素的大小，使用sizeof(arr[0])来获取，
  //第四个参数是一个函数指针，用来指定排序时的比较规则。
  qsort(arr,n,sizeof(arr[0]),int_cmp);
  for(i=0;i<n;i++)
  {
    printf("%d ",arr[i]);
  }
  return 0;
}
*/
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  int n, m, a[1000], b[1000], c[2000];
  int i, j, k;

  scanf("%d %d", &n, &m);

  // 读取第一个有序数组
  for (i = 0; i < m; i++) {
    scanf("%d", &a[i]);
  }

  // 读取第二个有序数组
  for (i = 0; i < (n - m); i++) {
    scanf("%d", &b[i]);
  }

  // 合并两个有序数组
  i = 0; // 第一个数组的索引
  j = 0; // 第二个数组的索引
  k = 0; // 合并后数组的索引

  while (i < m && j < (n - m)) {
    if (a[i] < b[j]) {
      c[k] = a[i];
      i++;
    } else {
      c[k] = b[j];
      j++;
    }
    k++;
  }

  // 将剩余元素添加到合并后的数组中
  while (i < m) {
    c[k] = a[i];
    i++;
    k++;
  }

  while (j < (n - m)) {
    c[k] = b[j];
    j++;
    k++;
  }

  // 输出合并后的数组
  for (i = 0; i < n; i++) {
    printf("%d ", c[i]);
  }

  return 0;
}